// 使用C语言调用python来识别垃圾类型

#include "face.h"

// 检测进程是否在运行
static int detect_process(const char *process_name)
{
    int n = -1;
    FILE *fp;
    char buf[128] = {0};

    sprintf(buf, "ps -ax | grep %s | grep -v grep", process_name);

    //  3270 ?        Sl    16:54 ./mjpg_streamer -i ./input_uvc.so -d /dev/...
    fp = popen(buf, "r");
    if (fp == NULL)
    {
        printf("Failed to run command\n");
        exit(-1);
    }

    // 读取结果
    memset(buf, sizeof(buf), 0);
    if (fgets(buf, sizeof(buf), fp) != NULL)
    {
        // 获取进程ID
        n = atoi(buf);
    }

    // 关闭流并等待命令执行完成
    if (pclose(fp) == -1)
    {
        fprintf(stderr, "Error closing pipe\n");
        exit(-1);
    }

    return n;
}

// 初始化操作
void face_initialize()
{
    // 初始化Python解释器
    Py_Initialize();

    // 获取sys.path对象
    PyObject *sys = PyImport_ImportModule("sys");
    PyObject *path = PyObject_GetAttrString(sys, "path");

    // 将当前路径添加到sys.path
    // PyUnicode_FromStrin 将 C 风格的字符串（即 char* 类型）转换为 Python 的 Unicode 字符串对象
    PyList_Append(path, PyUnicode_FromString("."));
}

void face_Finalize()
{
    // 关闭Python解释器
    Py_Finalize();
}

double face_category(double score)
{
    int ret = -1;

    // 检测mjpg_streamer服务是否开启
    ret = detect_process("mjpg_streamer");
    if (-1 == ret)
    {
        fprintf(stderr, "mjpg_streamer not open\n");
        return -1;
    }

    // 导入para模块
    PyObject *pModule = PyImport_ImportModule("face");
    if (!pModule)
    {
        PyErr_Print();
        printf("ERROR:failed to load face.py\n");
        goto FAILED_MODULE;
    }

    // 调用拍照指令
    system(WGET_CMD);
    // 拍摄的图片存在
    if (0 == access(GARBAGE_FILE, F_OK))
    {
        // 获取函数对象，并检查是否可以调用
        PyObject *pFunc = PyObject_GetAttrString(pModule, "alibbacloud_face");
        if (!pFunc || !PyCallable_Check(pFunc))
        {
            PyErr_Print();
            printf("ERROR:function alibbacloud_face not found or not callable\n");
            goto FAILED_FUNC;
        }

        // 函数调用Python函数，并获取返回值。
        PyObject *pvalue = PyObject_CallObject(pFunc, NULL);
        if (!pvalue)
        {
            PyErr_Print();
            printf("ERROR:function call failed\n");
            goto FAILED_VALUE;
        }

        // 用int PyArg_Parse(PyObject *args, const char *format, ...)函数将返回值转换为C类型，并检查是否有错误,没有返回值时不需要调用。
        double result = 0;
        // char *result = NULL;
        if (!PyArg_Parse(pvalue, "d", &result))
        {
            PyErr_Print();
            printf("Error: parse failed\n");
            goto FAILED_RESULT;
        }
        score = result;
        // 打印返回值
        printf("pvalue = %2f\n", result);

        // 函数释放所有引用的Python对象
    FAILED_RESULT:
        Py_DECREF(pvalue);
    FAILED_VALUE:
        Py_DECREF(pFunc);
    FAILED_FUNC:
        Py_DECREF(pModule);
    FAILED_MODULE:
        return score;
    }

    return -1;
}